package mine.code.question.动态规划;

import org.junit.Test;

import java.util.Arrays;

/**
 * 你将会获得一系列视频片段，这些片段来自于一项持续时长为T秒的体育赛事。这些片段可能有所重叠，也可能长度不一。
 * <p>
 * 视频片段clips[i]都用区间进行表示：开始于clips[i][0]并于clips[i][1]结束。我们甚至可以对这些片段自由地再剪辑，例如片段[0, 7]可以剪切成[0, 1] +[1, 3] + [3, 7]三部分。
 * <p>
 * 我们需要将这些片段进行再剪辑，并将剪辑后的内容拼接成覆盖整个运动过程的片段（[0, T]）。返回所需片段的最小数目，如果无法完成该任务，则返回-1 。
 * <p>
 * 示例 1：
 * <p>
 * 输入：clips = [[0,2],[4,6],[8,10],[1,9],[1,5],[5,9]], T = 10
 * 输出：3
 * <p>
 * 解释：
 * 我们选中 [0,2], [8,10], [1,9] 这三个片段。
 * 然后，按下面的方案重制比赛片段：
 * 将 [1,9] 再剪辑为 [1,2] + [2,8] + [8,9] 。
 * 现在我们手上有 [0,2] + [2,8] + [8,10]，而这些涵盖了整场比赛 [0, 10]。
 *
 * @author caijinnan
 */
public class 视频拼接 {

    @Test
    public void run() {
        int[][] clips = {{0, 2}, {4, 6}, {0, 10}, {1, 9}, {1, 5}, {5, 9}};
        int time = 10;
        System.out.println(videoStitching(clips, time));
    }

    public int videoStitching(int[][] clips, int time) {
        // dp[i] = min(dp[i-t])
        int[] dp = new int[time + 1];
        Arrays.fill(dp, Integer.MAX_VALUE);
        dp[0] = 0;
        for (int i = 1; i <= time; i++) {
            int tempMin = Integer.MAX_VALUE;
            for (int[] temp : clips) {
                if (temp[1] < i) {
                    continue;
                }
                if (temp[0] > i) {
                    continue;
                }
                int min;
                if(dp[temp[0]]==Integer.MAX_VALUE){
                    min = Integer.MAX_VALUE;
                }else{
                    min = dp[temp[0]] + 1;
                }
                tempMin = Math.min(min, tempMin);
            }
            dp[i] = tempMin;
        }
        if (dp[time] == Integer.MAX_VALUE) {
            return -1;
        }
        return dp[time];
    }
}
